package com.ktkj.init.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    /**
     * StringRedisTemplate, RedisTemplate 都是redis在Spring中的封装的模板工具类
     * StringRedisTemplate 从名字看, 是用来存取String的
     * RedisTemplate 从名字上看, 是什么都能干, 包含上面的
     * 两种实现都会将key使用对应的不同的序列化实现类实现
     * 因为是不用的序列化实现类, 所以出现了一个现象:
     * 比如在StringRedisTemplate中 将 a --> value 存入
     * 但是在 RedisTemplate 中用 a 为key是返回null的, 就是因为相通的key用不同的序列化, 结果也不一样, 到了redis-server哪里就是完全不同的key了
     * 解决办法, 就是在使用RedisTemplate时，重写它的setKeySerializer，setHashKeySerializer方法，将之改为StringRedisSerializer，这样可以做到键可读，值序列化.
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 配置redisTemplate
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer); // key序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value序列化
        redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); // Hash value序列化
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}
